package com.iwuke.dance.util.imagepicker;

import android.app.Activity;
import android.content.Context;
import android.net.Uri;

import com.iwuke.dance.R;
import com.luck.picture.lib.basic.PictureSelector;
import com.luck.picture.lib.config.SelectMimeType;
import com.luck.picture.lib.engine.CompressFileEngine;
import com.luck.picture.lib.entity.LocalMedia;
import com.luck.picture.lib.interfaces.OnKeyValueResultCallbackListener;
import com.luck.picture.lib.interfaces.OnResultCallbackListener;
import com.luck.picture.lib.style.PictureSelectorStyle;
import com.luck.picture.lib.style.TitleBarStyle;
import com.yalantis.ucrop.UCrop;

import java.io.File;
import java.util.ArrayList;
import top.zibin.luban.Luban;
import top.zibin.luban.OnNewCompressListener;

/**
 * @author: 魏从响
 * @date: 2025/10/21
 * @class: PictureSelectorUtil
 */
public class PictureSelectorUtil {

    private final PictureSelectorStyle pictureSelectorStyle;
    private Context context;
    private OnResultCompressListener<LocalMedia> onResultCompressListener;

    public PictureSelectorUtil(Context context){
        this.context = context;

        pictureSelectorStyle = new PictureSelectorStyle();
        TitleBarStyle titleBarStyle = new TitleBarStyle();
        titleBarStyle.setTitleDefaultText(context.getString(R.string.app_name));
        titleBarStyle.setTitleDefaultText(0);
        titleBarStyle.setHideTitleBar(false);
        //titleBarStyle.setTitleTextSize(50);
        pictureSelectorStyle.setTitleBarStyle(titleBarStyle);
    }

    /**
     * @desc 选择图片默认类型
     * public void selectImageDefaultType(){
     * @return
     * @author 魏从响
     * @time 2025/10/21 15:24
     */
    public void selectImageDefaultType(){
        PictureSelector.create(context)
                .openGallery(SelectMimeType.ofImage())
                .setImageEngine(GlideEngine.createGlideEngine())//设置相册图片加载引擎
                .isDisplayCamera(true)// 是否显示相机入口
                .setMaxSelectNum(9)// 图片最大选择数量
                .setMinSelectNum(1)// 图片最小选择数量
                .isPreviewImage(true)// 是否支持预览图片
                .isPreviewFullScreenMode(true)// 预览点击全屏效果
                .isEmptyResultReturn(true)// 支持未选择返回
                .isCameraRotateImage(true)// 拍照是否纠正旋转图片
                .isMaxSelectEnabledMask(true)// 达到最大选择数是否开启禁选蒙层
                .setCameraImageFormat("jpg")// 拍照图片输出格式
                .setFilterMaxFileSize(5120)// 过滤最大文件 KB单位
                .setFilterMinFileSize(1)// 过滤最小文件 KB单位
                .setSelectMaxFileSize(5120)// 最大可选文件大小 KB单位
                .setSelectMinFileSize(1)// 最小可选文件大小 KB单位
                .setQueryOnlyMimeType("jpg")// 查询指定文件类型
                .setSelectorUIStyle(pictureSelectorStyle) //标题栏默认文案
                .forResult(new OnResultCallbackListener<LocalMedia>() {
                    @Override
                    public void onResult(ArrayList<LocalMedia> result) {
                        if (onResultCompressListener!=null)
                            onResultCompressListener.onResult(result);
                    }

                    @Override
                    public void onCancel() {
                        if (onResultCompressListener!=null)
                            onResultCompressListener.onCancel();
                    }
                });
    }

    /**
     * @desc 选择图片压缩类型
     * //压缩 同一张照片 206kb 1536x2048px
     * @return
     * @author 魏从响
     * @time 2025/10/21 15:32
     */
    public void selectImageCompressType(){
//        PermissionX.init((FragmentActivity) context)
//                .permissions(
//                        Manifest.permission.CAMERA,
//                        Manifest.permission.MANAGE_EXTERNAL_STORAGE
//                )
//                .onExplainRequestReason((scope, deniedList, beforeRequest) -> {
//                    // 当有权限被用户拒绝过（但未勾选“不再询问”），解释为什么需要这些权限
//                    String message = "需要您授予以下权限才能正常使用该功能：";
//                    scope.showRequestReasonDialog(deniedList, message, "确定", "取消");
//
//                    // 当有权限被拒绝（但可再次请求）时，回调到此方法
//                    // deniedList 包含被拒绝的权限列表
//                    // 向用户展示一个对话框，解释为什么需要这些权限
//                    /*scope.showRequestReasonDialog(
//                            deniedList,
//                            "应用需要您授予相机、通讯录和电话权限，以实现核心的拍照、联系人和拨号功能。",
//                            "我明白了",
//                            "取消"
//                    );*/
//                })
//                .onForwardToSettings((scope,deniedList)-> {
//                    // 当有权限被永久拒绝（勾选了"不再询问"）时，回调到此方法
//                    // 引导用户去应用设置页面手动开启权限
//                    scope.showForwardToSettingsDialog(
//                            deniedList,
//                            "您已永久拒绝了一些必要权限。请前往应用的【设置】->【权限】中手动开启，以便功能正常使用。",
//                            "去设置",
//                            "暂不"
//                    );
//                })
//                .request((allGranted, grantedList, deniedList) -> {
//                    // 最终请求结果回调
//                    if (allGranted) {
//                        // 所有权限都已成功授予，可以执行相关操作
//
//                    } else {
//                        // 仍然有权限被拒绝（可能包括用户在解释对话框或设置页面操作后依旧拒绝的）
//                        Toast.makeText(context, "以下权限被拒绝：" + deniedList, Toast.LENGTH_SHORT).show();
//                    }
//                });

        PictureSelector.create(context)
                .openGallery(SelectMimeType.ofImage())
                .setImageEngine(GlideEngine.createGlideEngine())//设置相册图片加载引擎
                .isDisplayCamera(true)// 是否显示相机入口
                .setMaxSelectNum(1)// 图片最大选择数量
                .setMinSelectNum(1)// 图片最小选择数量
                .isPreviewImage(true)// 是否支持预览图片
                .isPreviewFullScreenMode(true)// 预览点击全屏效果
                .isEmptyResultReturn(true)// 支持未选择返回
                .isCameraRotateImage(true)// 拍照是否纠正旋转图片
                .isMaxSelectEnabledMask(true)// 达到最大选择数是否开启禁选蒙层
                .setCameraImageFormat("jpg")// 拍照图片输出格式
                .setFilterMaxFileSize(5120)// 过滤最大文件 KB单位
                .setFilterMinFileSize(1)// 过滤最小文件 KB单位
                .setSelectMaxFileSize(5120)// 最大可选文件大小 KB单位
                .setSelectMinFileSize(1)// 最小可选文件大小 KB单位
                .setQueryOnlyMimeType("jpg")// 查询指定文件类型
                .setSelectorUIStyle(pictureSelectorStyle) //标题栏默认文案
                .setCompressEngine(new CompressFileEngine() {
                    @Override
                    public void onStartCompress(Context context, ArrayList<Uri> source, OnKeyValueResultCallbackListener call){
                        //当原始图像文件大小小于一个值时，不进行压缩
                        //参数：size–文件大小的值，单位为KB，默认值为100K
                        Luban.with(context).load(source).ignoreBy(100)
                                .setCompressListener(new OnNewCompressListener() {
                                    @Override
                                    public void onStart() {

                                    }

                                    @Override
                                    public void onSuccess(String source, File compressFile) {
                                        if (call != null) {
                                            call.onCallback(source, compressFile.getAbsolutePath());
                                        }
                                    }

                                    @Override
                                    public void onError(String source, Throwable e) {
                                        if (call != null) {
                                            call.onCallback(source, null);
                                        }
                                    }
                                }).launch();
                    }
                })//压缩图片
                .forResult(new OnResultCallbackListener<LocalMedia>() {
                    @Override
                    public void onResult(ArrayList<LocalMedia> result) {
                        if (onResultCompressListener!=null)
                            onResultCompressListener.onResult(result);
                    }

                    @Override
                    public void onCancel() {
                        if (onResultCompressListener!=null)
                            onResultCompressListener.onCancel();
                    }
                });
    }

    public void setResultCompressListener(OnResultCompressListener<LocalMedia> onResultCompressListener){
        this.onResultCompressListener = onResultCompressListener;
    }


    /**
     * @desc 选择图片裁剪类型
     * result.getData()
     * @return
     * @author 魏从响
     * @time 2025/10/21 15:54
     */
    public void selectImageCropType(){
        PictureSelector.create(context)
                .openGallery(SelectMimeType.ofImage())
                .setImageEngine(GlideEngine.createGlideEngine())//设置相册图片加载引擎
                .isDisplayCamera(true)// 是否显示相机入口
                .setMaxSelectNum(1)// 图片最大选择数量
                .setMinSelectNum(1)// 图片最小选择数量
                .isPreviewImage(true)// 是否支持预览图片
                .isPreviewFullScreenMode(true)// 预览点击全屏效果
                .isEmptyResultReturn(true)// 支持未选择返回
                .isCameraRotateImage(true)// 拍照是否纠正旋转图片
                .isMaxSelectEnabledMask(true)// 达到最大选择数是否开启禁选蒙层
                .setCameraImageFormat("jpg")// 拍照图片输出格式
                .setFilterMaxFileSize(5120)// 过滤最大文件 KB单位
                .setFilterMinFileSize(1)// 过滤最小文件 KB单位
                .setSelectMaxFileSize(5120)// 最大可选文件大小 KB单位
                .setSelectMinFileSize(1)// 最小可选文件大小 KB单位
                .setQueryOnlyMimeType("jpg")// 查询指定文件类型
                .setSelectorUIStyle(pictureSelectorStyle) //标题栏默认文案
                .forResult(new OnResultCallbackListener<LocalMedia>() {
                    @Override
                    public void onResult(ArrayList<LocalMedia> result) {
                        //裁剪
                        UCrop.of(Uri.parse(result.get(0).getPath()), getDestinationUri(context))
                                .withAspectRatio(9, 16)
                                .withMaxResultSize(1080, 1920)
                                .start((Activity) context);
                    }

                    @Override
                    public void onCancel() {

                    }
                });
    }

    public static Uri getDestinationUri(Context context) {
        String fileName = String.format("fr_crop_%s.jpg", System.currentTimeMillis());
        //File cropFile = new File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), fileName);
        File cropFile = new File(context.getExternalCacheDir(),fileName);
        return Uri.fromFile(cropFile);
    }



//裁剪回调和下面的一样
//    private ActivityResultLauncher<Intent> activityResultLauncher =
//            registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
//                if (result.getResultCode() == RESULT_OK) {
//                    final Uri imageUri = UCrop.getOutput(result.getData());
//                    //小图加载
//                    Glide.with(AddCareerActivity.this).load(imageUri).into(img_proof_image);
//                    ArrayList<String> pathList=new ArrayList<>();
//                    pathList.add(imageUri.getPath());
//                } else if (result.getResultCode() == UCrop.RESULT_ERROR) {
//                    final Throwable cropError = UCrop.getError(result.getData());
//                    Log.d("++++++++++",new Gson().toJson(cropError));//
//                }
//            });

//裁剪回调
//    @Override
//    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
//        super.onActivityResult(requestCode, resultCode, data);
//        if (requestCode == Util.REQUEST_SELECT_IMAGES_CODE && resultCode == RESULT_OK) {
//            switch (requestCode) {
//                case UCrop.REQUEST_CROP:
//                    final Uri imageUri = UCrop.getOutput(data);
//                    //小图加载
//                    Glide.with(AddCareerActivity.this).load(imageUri).into(img_proof_image);
//                    ArrayList<String> pathList=new ArrayList<>();
//                    pathList.add(imageUri.getPath());
//                    break;
//            }
//        }
//    }
}
